/**
 * Created by zhangguoyu on 16/4/16.
 */

var util = require('util');

module.exports = {
  /**
   * 将对象转换问数组
   * @param val
   * @returns {Array.<T>}
   */
  toArray: function (val) {
    return Array.prototype.slice.call(val);
  },
  /**
   * 判断对象是否是方法对象
   * @param obj
   * @returns {boolean}
   */
  isFunction: function (obj) {
    return typeof obj === 'function';
  },
  /**
   * 判断对象是否是Promise对象
   * @param obj
   * @returns {boolean}
   */
  isPromise: function (obj) {
    return obj && obj.constructor === Promise;
  },
  /**
   * 遍历一个列表对象,并返回该列表对象的拷贝
   * @param obj 列表对象
   * @param func 转换辅助方法
   * @param caller 辅助方法调用对象
   * @returns {Array} 列表对象的拷贝
   */
  forEach: function (obj, func, caller) {
    if (!Array.isArray(obj) || !obj.length) {
      return [];
    }
    if (!Array.isArray(obj) && obj.prototype.hasOwnProperty('length')) {
      obj = this.toArray(obj);
    }
    var na = [];
    obj.forEach(function (item) {
      var t = item;
      if (this.isFunction(func)) {
        t = func.call(caller !== undefined ? caller : this, item);
        if (t) {
          item = t;
        }
      }
      na.push(item)
    });
    return na;
  },
  /**
   * 调用方法
   */
  callFunc: function () {
    if (arguments.length > 1) {
      var args = this.toArray(arguments);
      var called = args[0];
      var caller = args[1];
      if (this.isFunction(called)) {
        called.apply(caller, args.slice(2));
      }
    }
  },
  extend: function (constructor, extended) {
    var utils = this;
    var args = utils.toArray(arguments);
    var argsStart = 2;
    args = args.slice(argsStart);
    var func = function () {
      if (utils.isFunction(extended)) {
        extended.apply(this, args)
      }
      if (utils.isFunction(constructor)) {
        constructor.apply(this, utils.toArray(arguments));
      }
    };
    if (utils.isFunction(extended)) {
      util.inherits(func, extended);
    }
    return func;
  }
};